            BOI.7. (Sortare). Tehnica recicl[rii sticlei solicit[ ca sticla recuperat[ de
la populaie s[ fie separat[ dup[ culoare n trei categorii: maro, verde i incolor[.
Sunt date ordonat trei containere, fiecare avnd un num[r specificat de sticle maro,
verzi i incolore. Pentru a putea fi reciclate, sticlele trebuiesc mutate astfel ca n
final fiecare container s[ conin[ sticle de o singur[ culoare. Problema const[ n
minimizarea num[rului de mut[ri ale sticlelor (cte una), n ipoteza c[ toate
containerele au capacitate infinit[.
           Pe prima linie a fiierului de intrare este un num[r care specific[ num[rul
de linii (teste) succesive. Pe fiecare din aceste linii se afl[ nou[ numere separate
de cte un spaiu; primele trei reprezint[ num[rul de sticle maro, verzi i respectiv
incolore din containerul 1, urm[toarele trei numere pe cele din containerul 2, iar
ultimele trei, pe cele din containerul 3.
           Pentru fiecare linie de intrare se va afia o linie cu structura:
a) un ir format din caracterele B,G,C (culorile maro, verde, incolor) reprezentnd
n ordine coninutul fiec[ruia din cele trei containere;
b) un ntreg reprezentnd num[rul minim de mut[ri ale sticlelor.
Atenie: dac[ exist[ mai multe soluii optime, se afieaz[ numai soluia care este
prima n ordonarea alfabetic[ (dac[ soluiile ar fi GBC 18 i CGB 18, s-ar afia
numai CGB 18).
Exemple:
i) Intrare:
1 2 3 4 5 6 7 8 9
Ieire:
BCG 30
ii) Intrare:
5 10 5 20 10 5 10 20 10
Ieire:
CBG 50
===============================================
          BOI 7 (Iuliu Vasilescu):
program sortare;
const p:array[1..6,1..3] of
integer=((1,3,2),(1,2,3),(3,1,2),(3,2,1),(2,1,3),             
    (2,3,1));
      cu:array[1..3] of char=('B','G','C');
var s:array[1..3,1..3] of integer;
    mu,mum,km:integer;
    i,j,k:integer;
    f:text;
    n,l:integer;
begin
   assign(f,'in_pl3.txt');reset(f);read(f,n);
   writeln('Solutiile sunt:');
{Se verifica pe rand, in ordine alfabetica, fiecare posilitate
de aranjare a sticlelor, retinand-o pe cea mai avantajoasa}
   for l:=1 to n do 
      begin
         for i:=1 to 3 do for j:=1 to 3 do read(f,s[i,j]);
         km:=0;
         for k:=1 to 6 do 
            begin
               mu:=0;
               for i:=1 to 3 do for j:=1 to 3 do
               if p[k,i]<>j then mu:=mu+s[i,j];
               if (mu<mum)or(km=0) then 
                  begin
                     km:=k; mum:=mu;
                  end;
             end;
        write('  ');
        for i:=1 to 3 do write(cu[p[km,i]]);
        writeln('  ',mum);
      end;
end.
-----------------------------------------
